<!DOCTYPE html>
<html lang="zh-cn">
  <head>
    <meta charset="UTF-8">
    <title>Sucha's Blog - Archive for March, 2025</title>
    <meta name="generator" content="MarkdownProjectCompositor.lua">
    <meta name="author" content="Sucha">
    <meta name="keywords" content="suchang, programming, Linux, Lua">
    <meta name="description" content="Sucha's blog">
    <link rel="shortcut icon" href="../images/ico.png">
    <link rel="stylesheet" type="text/css" href="../styles/blog.css">
    <link rel="stylesheet" type="text/css" href="../styles/prism.min.css">
    <style id="site_theme"></style>
  </head>
  <body>
    <div id="body">
      <div id="text">
	   <!-- Page published by cmark-gfm begins here --><h1>Sucha's Blog ~ Archive for March, 2025</h1>
<p><a id="p0"></a></p>
<div class="date">25年3月23日 周日 21:04</div>
<h2>AUGraph (1)</h2>
<p>说到 iOS 的音频播放，以及录音部分，之前我从未接触过，之前的音视频处理简单点说，其实就是纯 MP4 流的播放，要么是 AVPlayItem 用 https URL 的 mp4、要么是 HLS，反正都是其他组同事封装好的库。</p>
<p>现在遇到的是纯音频的处理，好不容易网上搜到了 2 篇相关的介绍：</p>
<ul>
<li><a href="https://blog.csdn.net/CSDNedu/article/details/143510532">01｜iOS平台音频渲染（一）：使用AudioQueue渲染音频</a></li>
<li><a href="https://blog.csdn.net/CSDNedu/article/details/143510539">02｜iOS平台音频渲染（二）：使用 AudioUnit 渲染音频</a></li>
</ul>
<p>但是总有些限制，比如因为更倾向于 8KHz 的输出（低质量的人声），导致 AudioQueue 其实要处理起来也复杂，反正按照网上的东拼西凑的教程，没能搞好从 48KHz 转 8KHz 的 PCM 流。</p>
<p>倒是在 github 上找到了使用 AUGraph 的方案，使用 AUGraph 串联起一个 AudioUnit（貌似不需要 AUGraph 也是可以的），每个 AudioUnit 包含 input（录音）、output（播放）两个 path（大概意思）。</p>
<p>每个 path 又涉及到输入、输出，比如对于播放，输入就是提供 PCM 流，输出则是连接到硬件喇叭、耳机、蓝牙等等。对于录音，输入则是硬件录音，输出则是转频率后的 PCM 流。</p>
<p>这样就很方便了。</p>
<p>当然细节上，还有 AVAudioSession 的处理，其实算是一个独占或者公用音频硬件资源的配置管理类，大概意思。</p>
<p>但仅仅这样是不够的，因为如果距离较近，则环境音、人声都可能导致回音，苹果硬件给提供了一个降人声回声的处理，但感觉没啥用；另外就是很容易就遇到啸叫的问题，而苹果是没有提供这方面的处理的。</p>
<p>有些声音处理的第三方库貌似对啸叫有抑制的作用，但我看了一下源码，其实也是 AUGraph 组的，没能看出如何处理啸叫的，让人头痛。</p>
<p>还有就是硬件转码 48KHz 到 8KHz，感觉质量有点差，原因不清楚。</p>
<p>反正效果一般般，大概这样吧。</p>
<div class="category"><a href="CategoryProgramming.html">CategoryProgramming</a> / <a href="2025-03.html#p0">Permalink</a> / <a href="https://github.com/lalawue/homepage/discussions/categories/blog" target="_blank">Discussion</a></div>
<!-- Page published by cmark-gfm ends here -->
  <div id="foot">2004-<script>var d = new
	Date();document.write(d.getFullYear())</script> &copy;
	Sucha. Powered by MarkdownProjectCompositor.
  </div>
  </div><!-- text -->
  <div id="sidebar">
  </div><!-- sidebar -->
  <script src="../js/prism.min.js" async="async"></script>
  <script src="../js/blog_sidebar.js"></script>
  </div> <!-- body -->
</body>
</html>